package org.me.client;

public class FunktionenReihe {
	private AnalisierteFunktion[] Fk;

	private VariablenReihe Xk;

	private int N;

	/**
	 * @param funktionenStraenge
	 * @param xk
	 */
	public FunktionenReihe(String[] funktionenStraenge, Variable[] xk)
			throws FehlungDerFunktionenReihe {
		setN(funktionenStraenge.length);
		int M = xk.length;
		if (getN() == M) {
			AnalisierteFunktion[] fk = new AnalisierteFunktion[M];
			for (int i = 0; i < M; i++) {
				fk[i] = new AnalisierteFunktion(funktionenStraenge[i], xk);
			}
			Fk = fk;
			Xk = new VariablenReihe(xk);
		} else {
			throw new FehlungDerFunktionenReihe("len(F)!=len(X)");
		}
	}

	/**
	 * @param fk
	 * @param xk
	 */
	public FunktionenReihe(AnalisierteFunktion[] fk, Variable[] xk)
			throws FehlungDerFunktionenReihe {
		setN(fk.length);
		int M = xk.length;
		if (getN() == M) {
			Fk = fk;
			Xk = new VariablenReihe(xk);
		} else {
			throw new FehlungDerFunktionenReihe("len(F)!=len(X)");
		}
	}

	/**
	 * @param fk
	 * @param xk
	 */
	public FunktionenReihe(AnalisierteFunktion[] fk, VariablenReihe xk)
			throws FehlungDerFunktionenReihe {
		setN(fk.length);
		int M = xk.length();
		if (getN() == M) {
			Fk = fk;
			Xk = xk;
		} else {
			throw new FehlungDerFunktionenReihe("len(F)!=len(X)");
		}
	}

	public NummerMatrix funktionenAbzuschaetzen() {
		NummerMatrix sErgebnis = new NummerMatrix(getN(),1);
		for (int i = 0; i < getFk().length; i++) {
			sErgebnis.sElementSetzen(getFk()[i].abzuschaetzen(getXk()), i, 0) ;
		}
		return sErgebnis;
	}

	public int length(){
		return this.Fk.length;
	}

	protected FunktionenReihe(){

	}

	/**
	 * @return the xk
	 */
	public VariablenReihe getXk() {
		return Xk;
	}

	/**
	 * @param xk
	 *            the xk to set
	 */
	public void setXk(VariablenReihe xk) throws FehlungDerFunktionenReihe {
		if (xk.length() != Xk.length()) {
			throw new FehlungDerFunktionenReihe("len(var)<len(Xk)");
		}
		Xk = xk;
	}

	/**
	 * @return the fk
	 */
	public AnalisierteFunktion[] getFk() {
		return Fk;
	}

	/**
	 * @return the n
	 */
	public int getN() {
		return N;
	}

	/**
	 * @param n
	 *            the n to set
	 */
	private void setN(int n) {
		N = n;
	}
}
